If required, context_switch() must pull state off of
old CPU.
Signed-off-by: Keir Fraser <keir@xensource.com>
{
unsigned int cpu = smp_processor_id();
+ ASSERT(local_irq_is_enabled());
+
set_current(next);
if ( (percpu_ctxt[cpu].curr_vcpu != next) &&
!is_idle_domain(next->domain) )
{
+ /* This may happen if next has been migrated by the scheduler. */
+ if ( unlikely(!cpus_empty(next->vcpu_dirty_cpumask)) )
+ {
+ ASSERT(!cpu_isset(cpu, next->vcpu_dirty_cpumask));
+ sync_vcpu_execstate(next);
+ ASSERT(cpus_empty(next->vcpu_dirty_cpumask));
+ }
+
local_irq_disable();
__context_switch();
local_irq_enable();